package letcode.oneQuestionPerDay._202003._20200304;

import java.util.LinkedList;
import java.util.Queue;

/*
腐烂的橘子
 */
public class RottingOranges {
    public static void main(String[] args) {
        int[][] grid={{2,1,1},{1,1,0},{0,1,1}};
        System.out.println(orangesRotting(grid));

        int[][] grid1={{2,1,1},{0,1,1},{1,0,1}};
        System.out.println(orangesRotting(grid1));

        int[][] grid2={{0,2}};
        System.out.println(orangesRotting(grid2));

    }
    public static int orangesRotting(int[][] grid) {
        int m=grid.length;  //列数
        int n=grid[0].length;  //行数

        //得到新鲜橘子的数量，把腐烂橘子放入到队列中
        int goodsOrg=0; //新鲜橘子数量
        Queue<int[]> bad=new LinkedList<>();
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j]==1)
                    goodsOrg++;
                if (grid[i][j]==2){
                    bad.add(new int[]{i,j});
                }
            }
        }

        //BFS 广度优先搜索
        int minute=0; //分钟数，或者说层数。默认为0.
        while (goodsOrg>0&&!bad.isEmpty()){
            minute++;
            int badNumber=bad.size();
            for (int i = 0; i < badNumber; i++) {
                int[] orange=bad.poll();
                int r=orange[0];
                int c=orange[1];

                //腐烂的过程
                if (r-1>=0&&grid[r-1][c]==1){//左边
                    grid[r-1][c]=2;
                    goodsOrg--;
                    bad.add(new int[]{r-1,c});
                }
                if (r+1<m&&grid[r+1][c]==1){//右边
                    grid[r+1][c]=2;
                    goodsOrg--;
                    bad.add(new int[]{r+1,c});
                }
                if (c-1>=0&&grid[r][c-1]==1){//上边
                    grid[r][c-1]=2;
                    goodsOrg--;
                    bad.add(new int[]{r,c-1});
                }
                if (c+1<n&&grid[r][c+1]==1){//下边
                    grid[r][c+1]=2;
                    goodsOrg--;
                    bad.add(new int[]{r,c+1});
                }

            }
        }

        //判断是否有剩余的新鲜句子
        if(goodsOrg>0){
            return -1;
        }else {
            return minute;
        }
    }
}
/*
994. 腐烂的橘子
在给定的网格中，每个单元格可以有以下三个值之一：

值 0 代表空单元格；
值 1 代表新鲜橘子；
值 2 代表腐烂的橘子。
每分钟，任何与腐烂的橘子（在 4 个正方向上）相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能，返回 -1。



示例 1：



输入：[[2,1,1],[1,1,0],[0,1,1]]
输出：4
示例 2：

输入：[[2,1,1],[0,1,1],[1,0,1]]
输出：-1
解释：左下角的橘子（第 2 行， 第 0 列）永远不会腐烂，因为腐烂只会发生在 4 个正向上。
示例 3：

输入：[[0,2]]
输出：0
解释：因为 0 分钟时已经没有新鲜橘子了，所以答案就是 0 。


提示：

1 <= grid.length <= 10
1 <= grid[0].length <= 10
grid[i][j] 仅为 0、1 或 2
 */